home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1993-08-16 | 6.4 KB | 218 lines |
- (******************************
- * Programm von Dieter Seidel *
- * Eingegeben am 14.11.1991 *
- ******************************)
-
-
- IMPLEMENTATION MODULE QuadBerechneQuad;
-
- FROM InOut IMPORT WriteCard, WriteLn, Write, WriteString;
- FROM QuadLese IMPORT MaxBefehle, MaxQuad, MaxZeile, WhileBegin,
- arrZeile, QuadZeile, arrQuad, arrList;
- FROM QuadHoleBefehle IMPORT HoleZuweisung, HoleSchleife, HoleUnterprogramm;
-
-
- PROCEDURE BerechneQuad( BefehlsListe : arrList;
- VAR QuadListe : arrQuad);
- VAR Zaehler,
- Zeiger,
- Counter,
- Counter2,
- begin : CARDINAL;
- Korrekt : BOOLEAN;
- array : ARRAY [1..MaxBefehle] OF WhileBegin;
- BEGIN
- begin:=0;
- Zaehler:=1;
- Zeiger:=1;
-
- REPEAT
- Korrekt:=FALSE;
-
- IF (Zaehler > MaxQuad) THEN
- WriteLn;
- WriteString("Fehler : Erhoehe MaxQuad!!!");
- WriteLn;
- HALT;
- END;
-
- IF ((Zeiger+10) > MaxBefehle) THEN
- WriteLn;
- WriteString("Fehler : Erhoehe MaxBefehle!!!");
- WriteLn;
- HALT;
- END;
-
- IF (BefehlsListe[Zeiger] = "b") AND NOT(Korrekt) THEN
- IF Zaehler > 1 THEN
- IF array[Zaehler-1].while THEN
- array[Zaehler-1].begin:=TRUE;
- ELSE
- WriteLn;
- WriteString("Fehler : kein while-begin gefunden!!!");
- WriteLn;
- HALT;
- END;
- END;
- INC(begin);
- INC(Zeiger);
- Korrekt:=TRUE;
- END;
-
- IF (BefehlsListe[Zeiger] = "X") AND NOT(Korrekt) THEN
- HoleZuweisung(QuadListe[Zaehler].Befehl,BefehlsListe,Zeiger);
- QuadListe[Zaehler].Zeile:=Zaehler;
- QuadListe[Zaehler].IFzeile:=Zaehler+1;
- QuadListe[Zaehler].ELSEzeile:=Zaehler+1;
- IF Zaehler > 1 THEN
- IF array[Zaehler-1].while AND NOT(array[Zaehler-1].begin) THEN
- QuadListe[Zaehler].IFzeile:=Zaehler-1;
- QuadListe[Zaehler].ELSEzeile:=Zaehler-1;
- Counter:=Zaehler-1;
- WHILE (Counter >= 1) AND (array[Counter].while) AND
- NOT(array[Counter].begin) DO
- DEC(Counter);
- END;
- INC(Counter);
- QuadListe[Counter].IFzeile:=Counter+1;
- QuadListe[Counter].ELSEzeile:=Zaehler+1;
- INC(Counter);
- WHILE Counter < Zaehler DO
- QuadListe[Counter].IFzeile:=Counter+1;
- QuadListe[Counter].ELSEzeile:=Counter-1;
- INC(Counter);
- END;
- END;
- END;
- array[Zaehler].while:=FALSE;
- array[Zaehler].begin:=FALSE;
- INC(Zaehler);
- Korrekt:=TRUE;
- END;
-
- IF (BefehlsListe[Zeiger] = "U") AND NOT(Korrekt) THEN
- HoleUnterprogramm(QuadListe[Zaehler].Befehl,BefehlsListe,Zeiger);
- QuadListe[Zaehler].Zeile:=Zaehler;
- QuadListe[Zaehler].IFzeile:=Zaehler+1;
- QuadListe[Zaehler].ELSEzeile:=Zaehler+1;
- IF Zaehler > 1 THEN
- IF array[Zaehler-1].while AND NOT(array[Zaehler-1].begin) THEN
- QuadListe[Zaehler].IFzeile:=Zaehler-1;
- QuadListe[Zaehler].ELSEzeile:=Zaehler-1;
- Counter:=Zaehler-1;
- WHILE (Counter >= 1) AND (array[Counter].while) AND
- NOT(array[Counter].begin) DO
- DEC(Counter);
- END;
- INC(Counter);
- QuadListe[Counter].IFzeile:=Counter+1;
- QuadListe[Counter].ELSEzeile:=Zaehler+1;
- INC(Counter);
- WHILE Counter < Zaehler DO
- QuadListe[Counter].IFzeile:=Counter+1;
- QuadListe[Counter].ELSEzeile:=Counter-1;
- INC(Counter);
- END;
- END;
- END;
- array[Zaehler].while:=FALSE;
- array[Zaehler].begin:=FALSE;
- INC(Zaehler);
- Korrekt:=TRUE;
- END;
-
- IF (BefehlsListe[Zeiger] = "w") AND NOT(Korrekt) THEN
- INC(Zeiger);
- HoleSchleife(QuadListe[Zaehler].Befehl,BefehlsListe,Zeiger);
- QuadListe[Zaehler].Zeile:=Zaehler;
- QuadListe[Zaehler].IFzeile:=0; (* Zaehler+1; *)
- QuadListe[Zaehler].ELSEzeile:=0; (* Zaehler+2; *)
- array[Zaehler].whileZeiger:=Zaehler;
- array[Zaehler].while:=TRUE;
- array[Zaehler].begin:=FALSE;
- INC(Zaehler);
- Korrekt:=TRUE;
- END;
-
- IF (BefehlsListe[Zeiger] = "e") AND NOT(Korrekt) THEN
- IF begin > 1 THEN
- Counter:=Zaehler-1;
- WHILE NOT(array[Counter].begin) AND (Counter >= 1) DO
- DEC(Counter);
- END;
- IF array[Counter].begin THEN
- array[Counter].begin:=FALSE;
- Counter2:=Counter+1;
- WHILE (Counter2 < Zaehler) AND
- (QuadListe[Counter2].ELSEzeile # Zaehler) DO
- INC(Counter2);
- END;
- IF (QuadListe[Counter2].ELSEzeile = Zaehler) AND
- (array[Counter2].while) AND (Counter2 < Zaehler) THEN
- QuadListe[Counter2].ELSEzeile:=array[Counter].whileZeiger;
- ELSE
- QuadListe[Zaehler-1].IFzeile:=array[Counter].whileZeiger;
- QuadListe[Zaehler-1].ELSEzeile:=array[Counter].whileZeiger;
- END;
- Counter2:=Counter-1;
-
- WHILE (Counter2 >= 1) AND (array[Counter2].while) AND
- NOT(array[Counter2].begin) DO
- DEC(Counter2);
- END;
- INC(Counter2);
- IF Counter2 >= 1 THEN
- IF array[Counter2-1].while THEN
- QuadListe[Counter2].ELSEzeile:=Counter2-1;
- END;
- END;
- IF (array[Counter2].while) AND NOT(array[Counter2].begin) THEN
- QuadListe[Counter2].ELSEzeile:=Zaehler;
- QuadListe[Counter2].IFzeile:=Counter2+1;
- INC(Counter2);
- WHILE Counter2 <= Counter DO
- QuadListe[Counter2].ELSEzeile:=Counter2-1;
- QuadListe[Counter2].IFzeile:=Counter2+1;
- INC(Counter2);
- END;
- END;
- ELSE
- WriteLn;
- WriteString("Ein 'end' ohne 'begin' gefunden!!!");
- WriteLn;
- HALT;
- END;
- END;
- DEC(begin);
- INC(Zeiger);
- IF BefehlsListe[Zeiger] = ";" THEN
- INC(Zeiger);
- END;
- Korrekt:=TRUE;
- END;
-
- IF NOT(Korrekt) THEN
- WriteLn;
- WriteString("Fehler!!! Keine korrekte Anweisung.");
- WriteLn;
- HALT;
- END;
-
- UNTIL begin = 0;
-
- IF Zaehler > MaxQuad THEN
- WriteLn;
- WriteString("Erhoehe MaxQuad!!!");
- WriteLn;
- HALT;
- ELSE
- QuadListe[Zaehler].Zeile:=0;
- QuadListe[Zaehler].IFzeile:=0;
- QuadListe[Zaehler].ELSEzeile:=0;
- QuadListe[Zaehler].Befehl:="";
- END;
- END BerechneQuad;
-
-
- END QuadBerechneQuad.
-